"""
导出题库到 Excel
"""
import requests
import pandas as pd
from colorama import Fore, init
from openpyxl import load_workbook
from openpyxl.styles import Alignment, Font, PatternFill
from config.settings import Config
from common.tools.init_service import InitService

# 打包命令（在项目根目录执行）：
# pyinstaller --onefile --icon=files/icon/Excel.ico --paths=. apps/export_excel.py

# 自动重置颜色
init(autoreset=True)


def export_questions_to_excel():
    """导出题库到 Excel"""
    
    print('┌───────────────────────────────────────')
    print(f'│ {Fore.CYAN}题库导出工具 - {Config.VERSION}')
    print('├───────────────────────────────────────')
    
    # 初始化服务
    init_service = InitService()
    init_service.check_and_create_files()
    
    # 用户登录
    login_data = init_service.login()
    
    # 检查用户角色
    user_role = login_data['data'].get('roles', '')
    if user_role != '付费':
        print('├───────────────────────────────────────')
        print(f'│ {Fore.RED}权限不足！')
        print(f'│ {Fore.YELLOW}此功能仅限付费用户使用')
        print(f'│ 当前角色：{user_role}')
        print(f'│ 请联系管理员开通付费权限')
        print('└───────────────────────────────────────')
        input('按任意键退出...')
        
    
    print('├───────────────────────────────────────')
    print(f'│ {Fore.GREEN}权限验证通过！')
    print(f'│ 用户角色：{user_role}')
    print('├───────────────────────────────────────')
    print(f'│ 正在获取题库数据...')
    
    try:
        # 获取题库数据
        url = f"{Config.get_api_base_url()}/user/get_question_list"
        params = {
            "page": 1,
            "pageSize": 2000
        }
        
        response = requests.get(url, params=params)
        response_data = response.json()
        
        if response_data['status'] != 200:
            print(f'│ {Fore.RED}获取题库失败：{response_data.get("msg", "未知错误")}')
            print('└───────────────────────────────────────')
            input('按任意键退出...')
            
        
        # 解析数据
        rows = response_data['data']['rows']
        total = response_data['data']['total']
        
        print(f'│ {Fore.GREEN}获取成功！共 {total} 条题目')
        print('├───────────────────────────────────────')
        print(f'│ 正在导出到 Excel...')
        
        # 准备数据（移除状态列）
        data_list = []
        for row in rows:
            data_list.append({
                'ID': row.get('id', ''),
                '题目': row.get('question', ''),
                '答案': row.get('answer', ''),
                '类型': row.get('type', ''),
                '作者': row.get('author', '')
            })
        
        # 创建 DataFrame
        df = pd.DataFrame(data_list)
        
        # 导出到 Excel
        output_file = 'files/题库.xlsx'
        df.to_excel(output_file, index=False, engine='openpyxl')
        
        # 设置样式
        print(f'│ 正在设置样式...')
        wb = load_workbook(output_file)
        ws = wb.active
        
        # 在第一行插入水印行
        ws.insert_rows(1)
        
        # 合并第一行的前5列（A1:E1）
        ws.merge_cells('A1:E1')
        
        # 设置水印文本
        watermark_cell = ws['A1']
        watermark_cell.value = '此题库由答题助手（www.19450815.cn）提供，共' + str(total) + '条题目'
        watermark_cell.font = Font(bold=True, size=12, color='808080')  # 灰色加粗
        watermark_cell.alignment = Alignment(horizontal='center', vertical='center')
        watermark_cell.fill = PatternFill(start_color='F0F0F0', end_color='F0F0F0', fill_type='solid')  # 浅灰色背景
        
        # 设置列宽
        ws.column_dimensions['A'].width = 10   # ID 列
        ws.column_dimensions['B'].width = 150  # 题目列
        ws.column_dimensions['C'].width = 80   # 答案列
        ws.column_dimensions['D'].width = 15   # 类型列
        ws.column_dimensions['E'].width = 20   # 作者列
        
        # 设置所有数据单元格居中对齐（从第2行开始）
        center_alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
        zebra_fill = PatternFill(start_color='E3E3E3', end_color='E3E3E3', fill_type='solid')
        
        for row_idx, row in enumerate(ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=1, max_col=ws.max_column), start=2):
            for cell in row:
                cell.alignment = center_alignment
                # 从第3行开始应用斑马条纹（偶数行添加背景色）
                if row_idx > 2 and row_idx % 2 == 0:
                    cell.fill = zebra_fill
        
        # 设置第2行表头样式（加粗 + 背景色）
        header_font = Font(bold=True, size=11, color='000000')
        header_fill = PatternFill(start_color='E3E3E3', end_color='E3E3E3', fill_type='solid')
        for cell in ws[2]:
            cell.font = header_font
            cell.fill = header_fill
        
        # 冻结前两行（水印行 + 标题行）
        ws.freeze_panes = 'A3'
        
        # 在第2行（标题行）添加自动筛选
        ws.auto_filter.ref = f'A2:E{ws.max_row}'
        
        # 保护工作表（允许使用自动筛选）
        ws.protection.password = '123.com'
        ws.protection.sheet = True
        ws.protection.autoFilter = False  # 允许使用自动筛选
        ws.protection.enable()
        
        # 保存文件
        wb.save(output_file)
        
        print(f'│ {Fore.GREEN}导出成功！')
        print('├───────────────────────────────────────')
        print(f'│ 文件位置：{output_file}')
        print(f'│ 题目数量：{len(data_list)} 条')
        print(f'│ 列数：5 列（ID、题目、答案、类型、作者）')
        print(f'│ 样式设置：✓ 列宽、✓ 居中、✓ 表头')
        print(f'│ 功能设置：✓ 冻结前2行、✓ 自动筛选')
        print('└───────────────────────────────────────')
        
    except requests.RequestException as e:
        print(f'│ {Fore.RED}网络请求失败：{str(e)}')
        print('└───────────────────────────────────────')
        input('按任意键退出...')
        
    except Exception as e:
        print(f'│ {Fore.RED}导出失败：{str(e)}')
        print('└───────────────────────────────────────')
        input('按任意键退出...')
        
    
    input('按任意键退出...')


if __name__ == '__main__':
    export_questions_to_excel()
